#include "BlockQueue.hpp"
#include "LockGuard.hpp"
#include "Task.hpp"

using namespace std;

void *consumer(void *args)
{
    BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *> (args);
    while(true)
    {
        sleep(1);
        Task t;
        // 1. 消费数据
        bq->Pop(&t);
        // 2. 进行处理
        t.Run();
        cout << "consumer data: " << t.PrintResult() << endl;


        // sleep(1);
        // // 1. 消费数据 bq->pop(&data)
        // int data = 0;
        // bq->Pop(&data);
        // // 2. 进行处理
        // cout << "consumer data: " << data << endl;

        //注意：消费者没有sleep
    }

    return nullptr;
}

void *productor(void *args)
{
    BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *> (args);
    while(true)
    {
        // 1. 有数据
        int data1 = rand() % 10;
        usleep(rand()%123);
        int data2 = rand() % 10;
        usleep(rand()%123);
        char oper = opers[rand() % opers.size()];
        Task t(data1, data2, oper);

        // for debug
        string task_string = t.PrintTask();
        cout << "productor Task: " << task_string << endl;

        // // 1. 有数据
        // int data = rand() % 10 + 1; // [1,10]
        // // 2. 进行生产 bq->push(data)
        bq->Push(t);
        // cout << "productor data: " << data << endl;

        // sleep(1);
    }

    return nullptr;
}

int main()
{
    srand((uint64_t)time(nullptr) ^ getpid() ^ pthread_self()); // 让生成的数更加随机
    BlockQueue<Task> *bq = new BlockQueue<Task>();
    pthread_t c,p; // 生产者和消费者
    pthread_create(&c, nullptr, consumer, bq);
    pthread_create(&p, nullptr, productor, bq);

    pthread_join(c, nullptr);
    pthread_join(p, nullptr);
    return 0;
}